//
//  WBMainViewController.swift
//  weibo
//
//  Created by 林帆 on 2017/3/10.
//  Copyright © 2017年 林帆. All rights reserved.
//
//sdgs
import UIKit

// 主控制器
class WBMainViewController: UITabBarController {

    // 定时器
    fileprivate var timer : Timer?
       
    override func viewDidLoad() {
        super.viewDidLoad()
        
        setupChildControllers()
        setupcomposeButton()
        setupTimer()
        setupStartView()

        // 设置代理
        delegate = self
        
        // 注册通知
        NotificationCenter.default.addObserver(self, selector: #selector(userLogin), name: NSNotification.Name(rawValue: WBUserShouldLoginNotification), object: nil)
    }
    
    deinit {
        // 销毁时钟
        timer?.invalidate()
        
        //注销通知
        NotificationCenter.default.removeObserver(self)
    }
    
    // MARK:- 监听方法
    @objc fileprivate func userLogin(n: NotificationCenter) {
        print("用户登录通知 \(n)")
        
        // 展现登录控制器 - 通常会和 UINavigationController 连用， 方便返回
        let nav = UINavigationController(rootViewController: WBOAuthViewController())
        
        present(nav, animated: true, completion: nil)
        
    }
    
    // 撰写微博
    // FIXME: 没有实现
    // private 保证方法私有， 当前对象才能访问
    // @objc 允许这个函数在运行时 用过OC 的消息机制被调用
     func composeStatus( ) {
        print("撰写微博")
        
    }
    
   // MARK: - 私有控件
     lazy var composeButton : UIButton = UIButton()
    
}

extension  WBMainViewController: UITabBarControllerDelegate {// 正规军
    func tabBarController(_ tabBarController: UITabBarController, shouldSelect viewController: UIViewController) -> Bool {
        print("将要切换到 \(viewController)")
        
        //1> 获取控制器在数组中的索引
        let index = childViewControllers.index(of: viewController)
        //2 > 获取当前索引  (判断当前索引为首页，index也是首页，重复点击首页的情况)
        if selectedIndex == 0 && index == selectedIndex {
            print("点击首页")
            //3 > 让表格滚动到顶部
            // 
            let nav = childViewControllers[0] as! UINavigationController
            let vc = nav.childViewControllers[0] as! WBHomeViewController
            
            // 滚动到顶部
            vc.tableview?.setContentOffset(CGPoint(x: 0, y: -64) , animated: true)
            
            // 刷新数据
            DispatchQueue.main.asyncAfter(deadline: DispatchTime.now() + 1, execute: {
                vc.loadData()
            })
            
            //清除 tabItem 的 badgeNumber
            vc.tabBarItem.badgeValue = nil
            UIApplication.shared.applicationIconBadgeNumber = 0
        }
        
        
        //判断目标控制器是否是 uiviewController
        
        return !viewController.isMember(of: UIViewController.self)//isMember 是这个类 但不包含子类。
    }
}

// MARK: - 时钟相关方法
extension WBMainViewController {
    //定义时钟
    func setupTimer () {
        timer = Timer.scheduledTimer(timeInterval: 5.0, target: self, selector: #selector(updateTimer), userInfo: nil, repeats: true)
    }

    @objc fileprivate func updateTimer() {
        
        if !WBNetworkManager.shared.userLogin {
            return
        }
        
        // 测试未读数量
        WBNetworkManager.shared.unreadCount { (count ) in
            self.tabBar.items?[0].badgeValue = count > 0 ? "\(count)" : nil
            
            // 设置 App的 badgeNumber
            UIApplication.shared.applicationIconBadgeNumber = count
        }
    }
}

// extension 类似于 OC中的分类。 在Swift中可以用来切分代码块
// 可以把功能近似的函数，放在一个extension 中
// 便于代码维护
// 和oc的分类一样 extension 中不能定义属性
// MARK : - 设置界面 
extension WBMainViewController {
    
     func setupcomposeButton() {
        composeButton.layer.borderColor = UIColor.cyan.cgColor
        composeButton.layer.borderWidth = 2
        composeButton.setTitle("A", for: .normal)
        composeButton.setTitleColor(#colorLiteral(red: 0.3411764801, green: 0.6235294342, blue: 0.1686274558, alpha: 1), for: .normal)
        tabBar.addSubview(composeButton)
        //计算按钮宽度
        let count  = CGFloat(childViewControllers.count)
        let w = tabBar.bounds.width / count - 1
        composeButton.frame = tabBar.bounds.insetBy(dx: 2 * w, dy: 0) // 缩缩缩
        print("按钮宽度  \(composeButton.bounds.width)")
        
        // 按钮监听方法
//         composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
        composeButton.addTarget(self, action: #selector(composeStatus), for: .touchUpInside)
    }
    // 设置所有子控制器
     func setupChildControllers() {
        // 0. 获取沙盒json路径
        let docDir = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true)[0]
        let jsonPath = (docDir as NSString).appendingPathComponent("demo.json")
        
        // 加载 data
        var data = NSData(contentsOfFile: jsonPath)
        //判断 data 是否有内容，如果没有，说明本地沙盒没有文件
        if data == nil {
            //从 Bundle 加载 data
            let path = Bundle.main.path(forResource: "demo.json", ofType: nil)
            data = NSData(contentsOfFile: path!)
        }
        // data 一定会有内容, 反序列化 
        
        //  从 bundle 加载配置的 json 
        
        //  1.路径 、2. 加载 NSData 、 3. 反序列化转换数组
        guard let array = try! JSONSerialization.jsonObject(with: data! as Data, options: [ ]) as? [Dictionary<String, Any>]
        else  {
            return
        }
       

        
        // 遍历数组， 循环创建控制器数组
        var arrayM = [UIViewController]()
        for dict in array {
            arrayM.append(controller(dict: dict as [String : AnyObject]))
            
        }
        
        viewControllers = arrayM
    }
    
    
    //   clsName, title, imageName
    private func controller(dict: [String : AnyObject]) -> UIViewController {
        
        //1.取字典内容
        guard let clsName = dict["clsName"] as? String,
        let title = dict["title"] as? String,
//        let imageName = dict["imageName"],
        let cls = NSClassFromString(Bundle.main.namespace + "." + clsName) as? WBBaseViewController.Type,
        let visitorDict = dict["visitorInfo"] as? [String : String]
        else {
            
            return UIViewController()
        }
        
        //2.  创建试图控制器
        
        let vc = cls.init()
        vc.title = title
        // 设置 字典
        vc.visitorInfoDictionary = visitorDict
        
        //3. 设置图片
        //        vc.tabBarItem.image = UIImage(named: imageName) 这边就不加图案了
        
        //4. 设置tabbar的标题字体 (大小)
        vc.tabBarItem.setTitleTextAttributes([NSForegroundColorAttributeName : UIColor.orange], for: .highlighted)
        vc.tabBarItem.setTitleTextAttributes([NSFontAttributeName : UIFont.systemFont(ofSize: 24)], for: .normal)
        
        //  实例化导航控制器的时候，会调用push方法将rootvc 加入栈内
        let nav = WBNavigonViewController(rootViewController: vc)
        return nav
    }
    
    fileprivate func setupStartView() {
        let v = WBNewFeatureView.NewFeatureView()
        v.frame = view.bounds
        view.addSubview(v)
    }
}















